unit uCompareDataThread;

interface

uses
  System.Classes, System.SysUtils, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls,
  Data.DB, uBaseCompThread;

type
  TCompareData = class(TBaseCompThread)
  private
    FirstDate: TDateTime;
    SecondDate: TDateTime;
    idPredpr: Int64;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean; idPredpr: int64; FirstDate,
      SecondDate: TDateTime; ProgressBar: TProgressBar; StatusBar: TStatusBar;
      PageControl: TPageControl; LoadExcelFileBtn, UpdateBtn: TButton; InsPanel: TPanel); overload;
  end;

var
  CompareData: TCompareData;

implementation

uses
  uCompDM;

// TCompareData
// Поток для выборки информации из баз данных

constructor TCompareData.Create(CreateSuspended: Boolean; idPredpr: int64;
  FirstDate, SecondDate: TDateTime; ProgressBar: TProgressBar; StatusBar:
  TStatusBar; PageControl: TPageControl; LoadExcelFileBtn, UpdateBtn: TButton; InsPanel: TPanel);
begin
  inherited Create(CreateSuspended, ProgressBar, StatusBar, PageControl,
    LoadExcelFileBtn, UpdateBtn, InsPanel);

  Self.idPredpr := idPredpr;
  Self.FirstDate := FirstDate;
  Self.SecondDate := SecondDate;
end;

procedure TCompareData.Execute;
var
  item: string;
begin
  with CompDM do
  try
    // Отключение всех контролов
    Synchronize(CompareMemTableEh.DisableControls);
    CompareMemTableEh.Active := False;

    Synchronize(SelectSvodDuplesFilial.DisableControls);
    Synchronize(SelectSvodDuplesOblpo.DisableControls);

    Self.Enabled := False;
    Synchronize(ChangeControlAvailability);

    Self.StatusText := 'Получение информации из временной таблицы...';
    Synchronize(SetStatusBarText);

    // Создание временных таблиц
    CrSvodInv.ExecSQL;
    CrSvodDuples.ExecSQL;
    CrSprProv.ExecSQL;

    Self.PBStyle := pbstMarquee;
    Synchronize(SetProgressBarStyle);

    // Цикл по филиалам
    for item in ObjectsDict.Keys do
    try
      // Подключение к филиалу
      ConnectToObject(ObjectsDict.Items[item]);

      // Создание временной таблицы и наполнение её информации о ЭСЧФ и проводках
      CrInvProv.ExecSQL;

      with InsInvProvData do
      begin
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr > 0 then
          SQL[SQL.Count - 2] :=
            'WHERE ISNULL(ISNULL(spr.globalcode, inv.globalcode),' + QuotedStr('') + ')=' +
            QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count - 2] := '-- Условие для предприятия';

        ExecSQL;
      end;

      // Выборка проводок филиала
      with SelectSprProvObj do
      begin
        Close;
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr > 0 then
          SQL[SQL.Count - 1] := 'AND ISNULL(pred.globalcode, ' + QuotedStr('') +
            ')=' + QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count - 1] := '-- Условие для предприятия';

        Open;
      end;

      Self.StatusText := 'Обновление таблицы проводок - ' + item;
      Synchronize(SetStatusBarText);

      // Заполнение временной таблицы с проводоками
      if not SelectSprProvObj.IsEmpty then
      begin
        SelectSprProvObj.First;

        while not SelectSprProvObj.Eof do
        begin
          InsertSprProv(SelectSprProvObjNumBuhSpr.AsString,
            SelectSprProvObjNumDoc.AsString, SelectSprProvObjnumDocPart.AsString,
            SelectSprProvObjNSF.AsString, SelectSprProvObjDataDoc.AsDateTime,
            SelectSprProvObjSumm.AsCurrency, SelectSprProvObjglobalcode.AsVariant,
            SelectSprProvObjdopUNN.AsInteger);

          SelectSprProvObj.Next;
        end;
      end;

      Self.StatusText := 'Обновление таблицы дубликатов - ' + item;
      Synchronize(SetStatusBarText);

      SelectDuplicateProv.Close;
      SelectDuplicateProv.Open;

      // Заполнение временной таблицы с дубликатами проводок
      if not SelectDuplicateProv.IsEmpty then
      begin
        SelectDuplicateProv.First;

        while not SelectDuplicateProv.Eof do
        begin
          InsertSvodDuples(SelectDuplicateProvNumBuhSpr.AsString,
            SelectDuplicateProvdocNumber.AsString, SelectDuplicateProvnumBuhinv.AsString,
            SelectDuplicateProvfullName.AsString, SelectDuplicateProvnamePredpr.AsString,
            SelectDuplicateProvdocDate.AsDateTime, SelectDuplicateProvsprSum.AsCurrency,
            SelectDuplicateProvtotalVat.AsCurrency, SelectDuplicateProvdopUNN.AsInteger);

          SelectDuplicateProv.Next;
        end;
      end;

      Self.StatusText := 'Обновление таблицы результатов - ' + item;
      Synchronize(SetStatusBarText);

      SelectInvProvData.Close;
      SelectInvProvData.Open;

      // Заполнение временной таблицы с результатами выборки
      if not SelectInvProvData.IsEmpty then
      begin
        SelectInvProvData.First;

        while not SelectInvProvData.Eof do
        begin
          InsertSvodInv(SelectInvProvDataglobalcode.AsVariant,
            SelectInvProvDatafullName.AsVariant, SelectInvProvDatadateTrans.AsVariant,
            SelectInvProvDatainvStatus.AsVariant, SelectInvProvDatasprSum.AsVariant,
            SelectInvProvDatatotalVat.AsVariant, SelectInvProvDatatotalCost.AsVariant,
            SelectInvProvDatatotalCostVat.AsVariant, SelectInvProvDataSvplace.AsVariant,
            SelectInvProvDataNumBuhSpr.AsVariant, SelectInvProvDataNumDocPart.AsVariant,
            SelectInvProvDatadocNumber.AsString, SelectInvProvDatadocDate.AsDateTime,
            SelectInvProvDatadopUnn.AsInteger);

          SelectInvProvData.Next;
        end;
      end;
    except
      on econ: EConnectException do
      begin
        Self.DialogMessage := 'Произошла ошибка при подключении к объекту ' +
          item + ' с текстом: ' + econ.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при подключении к объекту: ' + item;
        Synchronize(SetStatusBarText);
        Exit;
      end;
      on e: Exception do
      begin
        Self.DialogMessage := 'Объект: ' + item + #13#10 + e.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при получении информации в объекте: ' + item;
        Synchronize(SetStatusBarText);
        Exit;
      end;
    end;

    try
      Self.StatusText := 'Сравнение результатов с камеральным контролем...';
      Synchronize(SetStatusBarText);

      with SelectSvodInv do
      begin
        Close;
        Parameters.ParamByName('FirstDate').Value := DateToStr(Self.FirstDate);
        Parameters.ParamByName('SecondDate').Value := DateToStr(Self.SecondDate);

        if Self.idPredpr > 0 then
          SQL[SQL.Count - 2] := 'AND ISNULL(inv.idPredpr, exc.idPredpr)=' + QuotedStr(IntToStr(Self.idPredpr))
        else
          SQL[SQL.Count - 2] := '-- Условие предприятия';

        Open;
      end;

      Self.StatusText := 'Формирование таблицы результатов...';
      Synchronize(SetStatusBarText);

      // Активация контролов и наполнение датасетов информацией
      SelectSvodDuplesFilial.Close;
      SelectSvodDuplesFilial.Open;

      CompareMemTableEh.Active := True;
      CompareMemTableEh.SortByFields('namepredpr,invoicefullname');
      CompareMemTableEh.First;

      SelectSvodDuplesOblpo.Close;
      SelectSvodDuplesOblpo.Open;

      Self.StatusText := 'Формирование завершено. Количество записей: ' +
        IntToStr(SelectSvodInv.RecordCount) + '.' + 'Количество дубликатов: ' +
        IntToStr(SelectSvodDuplesFilial.RecordCount) + '.';
      Synchronize(SetStatusBarText);
    except
      on e: Exception do
      begin
        Self.DialogMessage := 'Ошибка отображения информации с текстом: ' + e.Message;
        Synchronize(ShowErrorDialog);
        Self.StatusText := 'Ошибка при отображении информации';
        Synchronize(SetStatusBarText);
      end;
    end;
  finally
    Self.Enabled := True;
    Synchronize(ChangeControlAvailability);

    Self.PBStyle := pbstNormal;
    Synchronize(SetProgressBarStyle);

    Synchronize(SelectSvodDuplesFilial.EnableControls);
    Synchronize(CompareMemTableEh.EnableControls);
    Synchronize(SelectSvodDuplesOblpo.EnableControls);
  end;
end;

end.

